package org.mysofts.eclipseman.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Date;
import java.util.Properties;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

/**
 * Énumération des entrée de configurations. Les valeurs sont lues depuis le
 * fichier de configuration présent sur $USER_DIRECTORY/.eclipse-man.properties
 * 
 * @author reda
 * 
 */
public enum AppConfig {
	/**
	 * Répertoire où est installé eclipse.
	 */
	ECLIPSES_PATH("path.eclipse", "/opt/eclipses"),
	/**
	 * Répertoire du store d'archive.
	 */
	ARCHIVE_STORE_PATH("path.archives-store", "/opt/eclipses/.archives");

	// [start] fields
	/**
	 * Nom de la propriété.
	 */
	private final String name;
	/**
	 * Valeur de la propriété.
	 */
	private String value;

	// [end]

	// [start] constructors
	/**
	 * constructeur.
	 * 
	 * @param name
	 *            Nom de l'entrée de configuration.
	 * @param value
	 *            Valeur par défaut.
	 */
	private AppConfig(final String name, final String value) {
		this.name = name;
		this.value = value;
	}

	static {
		AppLog.debug(MessageProvider.get("logs").sub("app-config")
				.sub("static").sub("start").value());
		final Properties props = new Properties();
		final File propFile = new File(FileUtils.getUserDirectory(),
				".eclipse-man.properties");
		if (propFile.isFile()) {
			InputStream in = null;
			try {
				in = FileUtils.openInputStream(propFile);
				props.load(in);
			} catch (IOException e) {
				AppLog.warn(
						MessageFormat.format(
								MessageProvider.get("logs").sub("app-config")
										.sub("static").sub("file-read-error")
										.value(), propFile), e);
			} finally {
				IOUtils.closeQuietly(in);
			}
		} else {
			AppLog.debug(MessageFormat.format(
					MessageProvider.get("logs").sub("app-config").sub("static")
							.sub("file-not-found").value(), propFile));

		} // end if

		for (AppConfig entry : AppConfig.values()) {
			String name = entry.getName();
			if (props.containsKey(name)) {
				String value = props.getProperty(name);
				entry.value = value;
			} else {
				AppLog.debug(MessageFormat.format(MessageProvider.get("logs")
						.sub("app-config").sub("static").sub("entry-not-found")
						.value(), name, entry.value));
				props.setProperty(name, entry.value);
			} // end if
		}
		FileOutputStream out = null;
		try {
			out = FileUtils.openOutputStream(propFile);
			props.store(out,
					"Fichier de configuration d'eclipse-man créé automatiquement le: "
							+ (new Date()).toString());
		} catch (IOException e) { // $codepro.audit.disable logExceptions
			AppLog.debug(MessageFormat.format(
					MessageProvider.get("logs").sub("app-config").sub("static")
							.sub("file-write-error").value(), propFile));
		} finally {
			IOUtils.closeQuietly(out);
		}
	}

	// [end]

	// [start] getters
	/**
	 * Nom de l'entrée de configuration.
	 * 
	 * @return the name of the configuration entry.
	 */
	public String getName() {
		return this.name;
	}

	/**
	 * Valeur de l'entrée de configuration.
	 * 
	 * @return the value
	 */
	public String getValue() {
		return this.value;
	}

	// [end]

}
